package role

import (
	"gorm.io/gorm"
)

// RoleMigrator 角色模块迁移器
type RoleMigrator struct{}

// NewRoleMigrator 创建角色模块迁移器
func NewRoleMigrator() *RoleMigrator {
	return &RoleMigrator{}
}

// GetName 返回模块名称
func (m *RoleMigrator) GetName() string {
	return "role"
}

// GetModels 返回需要迁移的模型
func (m *RoleMigrator) GetModels() []interface{} {
	return []interface{}{&Role{}}
}

// GetDependencies 返回依赖的模块名称
func (m *RoleMigrator) GetDependencies() []string {
	return []string{"permission"} // 角色模块依赖权限模块
}

// Migrate 执行模块特定的迁移逻辑
func (m *RoleMigrator) Migrate(db *gorm.DB) error {
	// 创建角色权限关联表
	return db.Exec(`
		CREATE TABLE IF NOT EXISTS role_permissions (
			role_id BIGINT UNSIGNED NOT NULL,
			permission_id BIGINT UNSIGNED NOT NULL,
			PRIMARY KEY (role_id, permission_id),
			INDEX idx_role_permissions_role_id (role_id),
			INDEX idx_role_permissions_permission_id (permission_id)
		)
	`).Error
}

// Seed 执行模块数据初始化
func (m *RoleMigrator) Seed(db *gorm.DB) error {
	// 检查是否已有角色数据
	var count int64
	db.Model(&Role{}).Count(&count)
	if count > 0 {
		return nil // 已有数据，跳过初始化
	}

	// 创建默认角色
	adminRole := Role{
		ID:          1,
		Name:        "admin",
		Code:        "admin",
		DisplayName: "超级管理员",
		Description: "拥有所有权限的超级管理员",
		Status:      1,
	}
	if err := db.Create(&adminRole).Error; err != nil {
		return err
	}

	userRole := Role{
		ID:          2,
		Name:        "user",
		Code:        "user",
		DisplayName: "普通用户",
		Description: "普通用户角色",
		Status:      1,
	}
	if err := db.Create(&userRole).Error; err != nil {
		return err
	}

	// 给超级管理员分配所有权限
	// 查询所有权限ID
	var permissionIDs []uint
	if err := db.Table("permissions").Where("deleted_at IS NULL").Pluck("id", &permissionIDs).Error; err != nil {
		return err
	}

	// 分配权限
	for _, permID := range permissionIDs {
		if err := db.Exec("INSERT INTO role_permissions (role_id, permission_id) VALUES (?, ?)", adminRole.ID, permID).Error; err != nil {
			return err
		}
	}

	// 给普通用户分配基础权限（仪表板和查看用户）
	basicPermissionIDs := []uint{1, 4}
	for _, permID := range basicPermissionIDs {
		if err := db.Exec("INSERT INTO role_permissions (role_id, permission_id) VALUES (?, ?)", userRole.ID, permID).Error; err != nil {
			return err
		}
	}

	return nil
}
